#ifndef CAMERA_H
#define CAMERA_H

///////////////////////////////////////////////////////////////////////////////
//Camera
///////////////////////////////////////////////////////////////////////////////

class Camera
{
public:
		 				Camera();
	void 				Work() const;

	void 				MoveRight( float dt );
	void 				MoveForward( float dt );
	void				Yaw( float step );
	void				Pitch( float step );	
	cg::Vec3			GetEye() const;

private:
	void				UpdateDir();
	void				UpdateRight();
	cg::Vec3 			eye;
	cg::Vec3 			up;
	cg::Vec3 			target;
	//
	cg::Vec3 			dir;
	cg::Vec3 			right;
};

CG_INLINE void Camera::MoveRight( float dt )
{
	eye += right * dt;
	target += right * dt;
}

CG_INLINE void Camera::MoveForward( float dt )
{
	eye += dir * dt;
	target += dir * dt;
}

CG_INLINE cg::Vec3 Camera::GetEye() const
{
	return eye;
}

CG_INLINE void Camera::UpdateDir()
{
	dir = target - eye;
	dir.Normalize();
}

CG_INLINE void Camera::UpdateRight()
{	
	right = Cross( dir, up );
	right.Normalize();
}

#endif